package es.sjdigital.rv.datos.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import es.sjdigital.rv.datos.connection.DbConnection;
import es.sjdigital.rv.datos.vo.CancionesVO;
import es.sjdigital.rv.rv_error.Error;

/**
 * Permite el acceso a la tabla canciones
 * @author jcmanso
 *
 */
public class CancionesDAO {

	private static final Logger log = Logger.getLogger(String.class.getName());
	
	/**
	 * 
	 * @param id
	 * @param nombre
	 * @param autor
	 * @param interprete
	 * @param coleccion_id
	 * @param tipo
	 * @param etiquetas
	 * @return Lista de canciones. Si se introduce un id se da la cancion con ese identificador.
	 * @throws Error 
	 */
	public List<CancionesVO> getCanciones(
			int id, String nombre, String autor, String interprete,
			int coleccion_id, String tipo, String[] etiquetas) throws Error{
		
		int s_id, s_coleccion;
		String s_nombre,s_autor, s_interprete, s_tipo;
		String[] s_etiquetas;
		List<CancionesVO> result = new ArrayList<CancionesVO>();
		DbConnection conex= new DbConnection();
		
		//Inicializamos las variables
		s_id = id;
		s_coleccion = coleccion_id;
		if (nombre == null) s_nombre = new String("");
		else s_nombre = nombre;
		if (autor == null) s_autor = new String("");
		else s_autor = autor;
		if (interprete == null) s_interprete = new String("");
		else s_interprete = interprete;
		if (interprete == null) s_tipo = new String("");
		else s_tipo = tipo;
		if (etiquetas == null) s_etiquetas = new String[]{""};
		else s_etiquetas = etiquetas;
		
		//Construimos la query
		//Si nos llega un identificador significa que se busca exactamente ese id
		String query = new String();
		if (s_id == 0){
			query = "SELECT * FROM canciones WHERE titulo LIKE '%"+s_nombre+"%' AND autor LIKE '%"+s_autor+
				"%' AND interprete LIKE '%"+s_interprete+"%' AND coleccion_id '%"+s_coleccion+"%' AND s_tipo LIKE '%"+s_tipo+"%'";
			if (etiquetas != null){
				query.concat("AND id IN (SELECT c.id "+
					"FROM canciones c "+
					"LEFT JOIN etiquetasxcancion x ON c.id = x.id_cancion "+
					"LEFT JOIN etiquetas e ON x.id_etiqueta = e.id "+
					"WHERE");
				for (int i=0; i<etiquetas.length; i++){
					query.concat(" e.tag LIKE '%"+s_etiquetas[i]+"%'");
					if (i!=etiquetas.length-1)
						query.concat(" OR");
				}
				query.concat(" GROUP BY c.id)");
			}
		}
		else
			query ="SELECT FROM canciones WHERE id LIKE '"+s_id+"'";
		
		//Realizamos la consulta
		try {
			Statement db = conex.getConnection().createStatement();
			ResultSet st = db.executeQuery(query);
			
			//Guardamos los resultados
			while (st.next()){			
				CancionesVO can_parcial = new CancionesVO();
				can_parcial.setId(st.getInt("id"));
				can_parcial.setTitulo(st.getString("titulo"));
				can_parcial.setTipo(st.getString("tipo"));
				can_parcial.setInterprete(st.getString("interprete"));
				can_parcial.setAutor(st.getString("autor"));
				can_parcial.setColeccionId(st.getInt("coleccion_id"));
				can_parcial.setComentario(st.getString("comentario"));				
				result.add(can_parcial);
			}
			db.close();

		} catch (SQLException e) {
			throw new Error("Fallo al obtener canciones",e);
		} 
		return result;
	}
	
	/**
	 * 
	 * @param can La canción que se quiera añadir (id = 0) o actualizar
	 * @return id de la cancion creada o actualizada
	 * @throws Error
	 */
	public int setCancion(CancionesVO can) throws Error{
		DbConnection conex= new DbConnection();

		if (can == null)
			throw new Error("Los datos deben estar completos");
	
		//Construimos la query
		int resp =0;
		String query = new String();
		try {
			Statement db = conex.getConnection().createStatement();
			ResultSet st = db.executeQuery(query);
			//Si id es cero se considera nueva canción
			if(can.getId()!=0){
				query="UPDATE canciones" +
							" SET titulo = '"+can.getTitulo()+
							"', tipo ='"+can.getTipo()+
							"', interprete = '"+can.getInterprete()+ 
							"', autor = '"+can.getAutor()+
							"', coleccion_id = '"+can.getColeccionId()+
							"', comentario = '"+can.getComentario()+
							"' WHERE canciones.id = '"+can.getId()+"'";
				db.executeUpdate(query);
				resp = can.getId();
			}
			else {
				query="INSERT INTO canciones ('titulo', 'tipo', 'interprete', 'autor', 'coleccion_id','comentario') VALUES (";
				query.concat("'"+can.getTitulo()+"', ");
				query.concat("'"+can.getTipo()+"', ");
				query.concat("'"+can.getInterprete()+"', ");
				query.concat("'"+can.getAutor()+"', ");
				query.concat("'"+can.getColeccionId()+"', ");
				query.concat("'"+can.getComentario()+"')");
				db.executeUpdate(query, db.RETURN_GENERATED_KEYS);
				ResultSet rs = db.getGeneratedKeys();
				if (rs != null && rs.next()) {
					resp = rs.getInt(1);
				}
				else resp = 0;
			}
			db.close();

		}
		catch (SQLException e){
			throw new Error(e);
			
		}
		return resp;
	}
}
